package jdbc;

import java.io.FileInputStream;
import java.sql.*;
import java.util.Properties;
import java.util.Scanner;

/**
 * 使用PreparedStatement
 */
@SuppressWarnings({"all"})
public class PreparedStatement_ {

    public static void main(String[] args) throws Exception {

        /*
            1. PreparedStatement执行的SQL语句中的参数用问号表示，调用PreparedStatement对象的
               setXxx()方法来设置这些参数。setXxx()方法有两个参数，第一个参数是要设置的SQL语句中
               的参数的索引(从1开始)，第二个时设置的SQL语句中的参数的值
            2. 调用executeQuery()，返回ResultSet对象
            3. 调用executeUpdate()，执行增、删、改操作

            预处理的好处
            1.不再使用 + 拼接sql语句，减少语法错误
            2.有效解决 sql 注入问题
            3.大大减少编译次数，效率高
         */
        Scanner scanner = new Scanner(System.in);

        //让用户输入管理员名和密码
        System.out.println("请输入管理员名字：");
        //如果希望看到sql注入，使用nextLine()方法碰到回车才结束
        //而next()方法碰到空格就结束
        String admin_name = scanner.nextLine();
        System.out.println("请输入管理员密码：");
        String admin_password = scanner.nextLine();


        //通过Properties 对象获取配置文件的信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql3.properties"));
        //获取相关值
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
//        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
        Connection connection = DriverManager.getConnection(url, user, password);

        //sql语句的问号相当于占位符
        String sql = "select name, pwd from admin where name = ? and pwd = ?";
        String insertSql = "insert into admin values(?,?)";
        //preparedStatement 是实现了 PreparedStatement接口的实现类
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setString(1, admin_name);
        preparedStatement.setString(2, admin_password);

        PreparedStatement preparedStatement1 = connection.prepareStatement(insertSql);
        preparedStatement1.setString(1, "张三");
        preparedStatement1.setString(2, "110");

        //执行查询语句，使用executeQuery()，参数不用再写sql。
        ResultSet resultSet = preparedStatement.executeQuery();
        //执行增删改语句，使用executeUpdate()
        int row = preparedStatement1.executeUpdate();
        System.out.println(row > 0 ? "执行成功" : "执行失败");
        if (resultSet.next()) { //如果查询到一条记录，则说明该管理存在
            System.out.println("登录成功！");
        } else {
            System.out.println("登录失败...");
        }
        //关闭连接
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }
}
